<?php

namespace App\Http\Controllers\Admin\User;

use App\Http\Controllers\Controller;
use App\Models\SystemUserLevel;
use App\Traits\Controllers\AdminTraits;
use App\Traits\Controllers\UpdateStatusTraits;
use App\Transformers\System\SystemUserLevelTransformer;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

class UserLevelController extends Controller
{
    use AdminTraits;

    use UpdateStatusTraits;

    //使用用户等级表的模型
    public $model = SystemUserLevel::class;

    public $transformer = SystemUserLevelTransformer::class;

    //改变会员等级的状态 是否显示
    public function status($id, Request $request)
    {
        //验证用户凭证信息
        $this->validateData($request);
        //得到要修改的模型
        $data = $this->getQuery()->findOrFail($id);
        //判断是否需要授权
        if ($this->policy) {
            $this->authorize('update', $data);
        }
        //判断传过来的的status是否跟原先的一样
        if ($data->is_show == $request->input('is_show')) {
            //一样的话返回错误
            return $this->response->error('重复操作', 500);
        }
        //执行修改
        $data->is_show = $request->input('is_show');

        $data->save();

        return $this->response->noContent();
    }

    //验证规则
    public function rules(Request $request): array
    {
        switch ($request->method()) {
            case 'GET':
                return [];
                break;
            case 'POST':
                return [
                    'name' => 'required|max:10',
                    'grade' => ['required', 'unique:system_user_levels'],
                    'icon' => 'required',
                    'image' => 'required',
                    'explain' => 'required',
                    'exp_num' => ['required', function ($attribute, $value, $fail) use ($request) { //进行会员经验的表单验证
                        // 会员经验要根据会员的等级来进行判断 获取到表单中传来的会员等级 获取到数据库中所有小于设置等级的用户
                        $grade = SystemUserLevel::query()->where('grade', '<', $request->grade)
                            ->where('exp_num', '>=', $request->exp_num)
                            ->get();
                        if ($grade->count()) {
                            $fail('升级经验请大于上一级所需的经验值');
                        }
                        // 会员经验不能小于上一个等级设置的经验 不能大于下一个等级设置的经验
                        $grade = SystemUserLevel::query()->where('grade', '>', $request->grade)
                            ->where('exp_num', '<=', $request->exp_num)
                            ->get();
                        if ($grade->count()) {
                            $fail('升级经验请小于下一级所需的经验值');
                        }
                    }]
                ];
                break;
            case 'PUT':
            case 'PATCH':
                return [
                    'name' => 'max:10',
                    'grade' => [Rule::unique('system_user_levels', 'grade')
                        ->ignore(route_parameter('level'), 'id')],
                    'exp_num' => [function ($attribute, $value, $fail) use ($request) { //进行会员经验的表单验证
                        // 会员经验要根据会员的等级来进行判断 获取到表单中传来的会员等级 获取到数据库中所有小于设置等级的用户
                        $grade = SystemUserLevel::query()->where('grade', '<', $request->grade)
                            ->where('exp_num', '>=', $request->exp_num)
                            ->get();
                        if ($grade->count()) {
                            $fail('升级经验请大于上一级所需的经验值');
                        }
                        // 会员经验不能小于上一个等级设置的经验 不能大于下一个等级设置的经验
                        $grade = SystemUserLevel::query()->where('grade', '>', $request->grade)
                            ->where('exp_num', '<=', $request->exp_num)
                            ->get();
                        if ($grade->count()) {
                            $fail('升级经验请小于下一级所需的经验值');
                        }
                    }],
                ];
        }
        return [];
    }

    //验证错误返回的信息
    public function ruleMessages(): array
    {
        return [
            'name.required' => '等级名称不能为空',
            'name.max' => '等级名称不能大于10个字符',
            'grade.required' => '请设置会员等级',
            'grade.unique' => '该等级已经存在',
            'icon.required' => '请选择一个等级图标',
            'image.required' => '请选择等级背景图片',
            'explain.required' => '请添加等级说明',
            'exp_num' => '请选择解锁需要的经验值',
        ];
    }
}
